﻿using UnityEngine;
using UnityEditor;

public class FindMissingScriptsRecursively : EditorWindow
{
  static int go_count, components_count, missing_count;

  [MenuItem("Window/FindMissingScriptsRecursively")]
  public static void ShowWindow()
  {
    GetWindow(typeof(FindMissingScriptsRecursively));
  }

  public void OnGUI()
  {
    if (GUILayout.Button("Find Missing Scripts in selected GameObjects"))
    {
      FindInSelected();
    }
  }

  private static void FindInSelected()
  {
    var go = Selection.gameObjects;
    go_count = 0;
    components_count = 0;
    missing_count = 0;
    foreach (var g in go)
    {
      FindInGO(g);
    }
    Debug.Log(string.Format("Searched {0} GameObjects, {1} components, found {2} missing", go_count, components_count, missing_count));
  }

  private static void FindInGO(GameObject g)
  {
    go_count++;
    var components = g.GetComponents<Component>();
    for (var i = 0; i < components.Length; i++)
    {
      components_count++;
      if (components[i] != null) continue;
      missing_count++;
      var s = g.name;
      var t = g.transform;
      while (t.parent != null)
      {
        s = t.parent.name + "/" + s;
        t = t.parent;
      }
      Debug.Log(s + " has an empty script attached in position: " + i, g);
    }
    // Now recurse through each child GO (if there are any):
    foreach (Transform childT in g.transform)
    {
      //Debug.Log("Searching " + childT.name  + " " );
      FindInGO(childT.gameObject);
    }
  }
}